﻿using System;


/// <summary>
/// 时间类
/// 1、SecondToMinute(int Second) 把秒转换成分钟
/// </summary>
public class TimeHelper
{

    /// <summary>
    /// 字符串转时间
    /// </summary>
    /// <returns></returns>
    public DateTime FormatTimeString(string str)
    {
        DateTime dt = Convert.ToDateTime(str);
        return dt;
    }

    /// <summary>
    /// 将时间格式化成 年月日 的形式,如果时间为null，返回当前系统时间
    /// </summary>
    /// <param name="dt">年月日分隔符</param>
    /// <param name="Separator"></param>
    /// <returns></returns>
    public string GetFormatDate(DateTime dt, char Separator)
    {
        if (dt != null && !dt.Equals(DBNull.Value))
        {
            string tem = string.Format("yyyy{0}MM{1}dd", Separator, Separator);
            return dt.ToString(tem);
        }
        else
        {
            return GetFormatDate(DateTime.Now, Separator);
        }
    }
    /// <summary>
    /// 将时间格式化成 时分秒 的形式,如果时间为null，返回当前系统时间
    /// </summary>
    /// <param name="dt"></param>
    /// <param name="Separator"></param>
    /// <returns></returns>
    public string GetFormatTime(DateTime dt, char Separator)
    {
        if (dt != null && !dt.Equals(DBNull.Value))
        {
            string tem = string.Format("hh{0}mm{1}ss", Separator, Separator);
            return dt.ToString(tem);
        }
        else
        {
            return GetFormatDate(DateTime.Now, Separator);
        }
    }
    /// <summary>
    /// 把秒转换成分钟
    /// </summary>
    /// <returns></returns>
    public static int SecondToMinute(int Second)
    {
        decimal mm = (decimal)((decimal)Second / (decimal)60);
        return Convert.ToInt32(Math.Ceiling(mm));
    }

    #region 返回某年某月最后一天
    /// <summary>
    /// 返回某年某月最后一天
    /// </summary>
    /// <param name="year">年份</param>
    /// <param name="month">月份</param>
    /// <returns>日</returns>
    public static int GetMonthLastDate(int year, int month)
    {
        DateTime lastDay = new DateTime(year, month, new System.Globalization.GregorianCalendar().GetDaysInMonth(year, month));
        int Day = lastDay.Day;
        return Day;
    }
    #endregion

    #region 返回时间差
    public static string DateDiff(DateTime DateTime1, DateTime DateTime2)
    {
        string dateDiff = null;
        try
        {
            //TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
            //TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);
            //TimeSpan ts = ts1.Subtract(ts2).Duration();
            TimeSpan ts = DateTime2 - DateTime1;
            if (ts.Days >= 1)
            {
                dateDiff = DateTime1.Month.ToString() + "月" + DateTime1.Day.ToString() + "日";
            }
            else
            {
                if (ts.Hours > 1)
                {
                    dateDiff = ts.Hours.ToString() + "小时前";
                }
                else
                {
                    dateDiff = ts.Minutes.ToString() + "分钟前";
                }
            }
        }
        catch
        { }
        return dateDiff;
    }
    #endregion

    #region 获得两个日期的间隔
    /// <summary>
    /// 获得两个日期的间隔
    /// </summary>
    /// <param name="DateTime1">日期一。</param>
    /// <param name="DateTime2">日期二。</param>
    /// <returns>日期间隔TimeSpan。</returns>
    public static TimeSpan DateDiff2(DateTime DateTime1, DateTime DateTime2)
    {
        TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
        TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);
        TimeSpan ts = ts1.Subtract(ts2).Duration();
        return ts;
    }
    #endregion

    #region 格式化日期时间
    /// <summary>
    /// 格式化日期时间
    /// </summary>
    /// <param name="dateTime1">日期时间</param>
    /// <param name="dateMode">显示模式</param>
    /// <returns>0-9种模式的日期</returns>
    public static string FormatDate(DateTime dateTime1, string dateMode)
    {
        switch (dateMode)
        {
            case "0":
                return dateTime1.ToString("yyyy-MM-dd");
            case "1":
                return dateTime1.ToString("yyyy-MM-dd HH:mm:ss");
            case "2":
                return dateTime1.ToString("yyyy/MM/dd");
            case "3":
                return dateTime1.ToString("yyyy年MM月dd日");
            case "4":
                return dateTime1.ToString("MM-dd");
            case "5":
                return dateTime1.ToString("MM/dd");
            case "6":
                return dateTime1.ToString("MM月dd日");
            case "7":
                return dateTime1.ToString("yyyy-MM");
            case "8":
                return dateTime1.ToString("yyyy/MM");
            case "9":
                return dateTime1.ToString("yyyy年MM月");
            default:
                return dateTime1.ToString();
        }
    }
    #endregion

    #region 得到随机日期
    /// <summary>
    /// 得到随机日期
    /// </summary>
    /// <param name="time1">起始日期</param>
    /// <param name="time2">结束日期</param>
    /// <returns>间隔日期之间的 随机日期</returns>
    public static DateTime GetRandomTime(DateTime time1, DateTime time2)
    {
        Random random = new Random();
        DateTime minTime = new DateTime();
        DateTime maxTime = new DateTime();

        System.TimeSpan ts = new System.TimeSpan(time1.Ticks - time2.Ticks);

        // 获取两个时间相隔的秒数
        double dTotalSecontds = ts.TotalSeconds;
        int iTotalSecontds = 0;

        if (dTotalSecontds > System.Int32.MaxValue)
        {
            iTotalSecontds = System.Int32.MaxValue;
        }
        else if (dTotalSecontds < System.Int32.MinValue)
        {
            iTotalSecontds = System.Int32.MinValue;
        }
        else
        {
            iTotalSecontds = (int)dTotalSecontds;
        }


        if (iTotalSecontds > 0)
        {
            minTime = time2;
            maxTime = time1;
        }
        else if (iTotalSecontds < 0)
        {
            minTime = time1;
            maxTime = time2;
        }
        else
        {
            return time1;
        }

        int maxValue = iTotalSecontds;

        if (iTotalSecontds <= System.Int32.MinValue)
            maxValue = System.Int32.MinValue + 1;

        int i = random.Next(System.Math.Abs(maxValue));

        return minTime.AddSeconds(i);
    }
    #endregion
}

